﻿using log4net;
using PcaCaja.BOL;
using PcaCore.DAL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace PcaCaja.DAL
{
    public class dMovimiento
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(dMovimiento));

        #region Public

        public static long Insert(oMovimiento myClass)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_caja.fn_add_movimiento(varchar,--empresa_id $1
                //              varchar,--oficina_id $2
                //              bigint,--grupo_movimiento_id $3
                //              bigint,--subgrupo_movimiento_id $4
                //              bigint,--sesion_id $5
                //              date,--fecha $6
                //              bigint,--liquidacion_id $7
                //              character,--usuario_id $8
                //              varchar,--detalle $9
                //              varchar,--moneda_id $10
                //              numeric --monto $11
                //              )RETURNS bigint
                object id = Core.ExecuteScalar("pca_caja.fn_add_movimiento",
                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.empresa_id),
                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.oficina_id),
                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, myClass.grupo_movimiento_id),
                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, myClass.subgrupo_movimiento_id),
                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, myClass.sesion_id),
                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Date, myClass.fecha),
                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, myClass.liquidacion_id),
                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.usuario_id),
                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.detalle),
                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.moneda_id),
                                               new oParametro(NpgsqlTypes.NpgsqlDbType.Numeric, myClass.monto));

                return Convert.ToInt64(id);  
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static void Update(oMovimiento myClass)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_caja.fn_update_movimiento(varchar,--empresa_id $1
                //             varchar,--oficina_id $2
                //             bigint,--movimiento_id $3
                //             bigint,--grupo_movimiento_id $4
                //             bigint,--subgrupo_movimiento_id $5 
                //             bigint,--sesion_id $6
                //             varchar,--detalle $7
                //             varchar,--moneda_id $8
                //             numeric --monto $9
                //             )RETURNS void
                Core.ExecuteNonQuery("pca_caja.fn_update_movimiento",
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar,myClass.empresa_id),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar,myClass.oficina_id),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, myClass.movimiento_id),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, myClass.grupo_movimiento_id),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, myClass.subgrupo_movimiento_id),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, myClass.sesion_id),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.detalle),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, myClass.moneda_id),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Numeric, myClass.monto));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static void Delete(string empresaId,string oficinaId,long movimientoId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_caja.fn_del_movimiento(varchar,--empresa_id $1
                //              varchar,--oficina_id $2
                //              bigint --movimiento_id $3
                //              )RETURNS void
                Core.ExecuteNonQuery("pca_caja.fn_del_movimiento",
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, movimientoId)); 
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static oVwMovimiento Get(string empresaId, string oficinaId, long movimientoId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_caja.fn_get_movimiento(varchar,--empresa_id $1
                //              varchar,--oficina_id $2
                //              bigint --movimiento_id $3
                //              )RETURNS SETOF pca_caja.vw_movimientos
                return Core.GetObjectDb<oVwMovimiento>("pca_caja.fn_get_movimiento",
                                                       new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                                       new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId),
                                                       new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, movimientoId)); 
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static List<oVwMovimiento> GetList(int start,
                                                  int limit,
                                                  out int totalRecords,
                                                  string empresaId,
                                                  string oficinaId,
                                                  DateTime fecha)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_caja.fn_get_list_movimientos(integer,--start $1
                //                integer,--limit $2
                //                varchar,--empresa_id $3
                //                varchar,--oficina_id $4
                //                date --fecha $5
                //                )RETURNS SETOF refcursor 
                return Core.GetListObjecstDb<oVwMovimiento>("pca_caja.fn_get_list_movimientos",
                                                            out totalRecords,
                                                            new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, start),
                                                            new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, limit),
                                                            new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                                            new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId),
                                                            new oParametro(NpgsqlTypes.NpgsqlDbType.Date, fecha));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static List<oVwMovimiento> GetList(int start,
                                                  int limit,
                                                  out int totalRecords,
                                                  string empresaId,
                                                  string oficinaId,
                                                  long liquidacionId,
                                                  string detalle)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_caja.fn_get_list_movimientos(integer,--start $1
                //                integer,--limit $2
                //                varchar,--empresa_id $3
                //                varchar,--oficina_id $4
                //                bigint,--liquidacion_id $5
                //                varchar --detalle $6
                //                )RETURNS SETOF refcursor
                return Core.GetListObjecstDb<oVwMovimiento>("pca_caja.fn_get_list_movimientos",
                                                            out totalRecords,
                                                            new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, start),
                                                            new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, limit),
                                                            new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                                            new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId),
                                                            new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, liquidacionId),
                                                            new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, detalle));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        #endregion
    }
}
